home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / mus / play / tracker_4_31.lzh / tracker / Arch / Soundblaster / audio.c next >
C/C++ Source or Header  |  1995-03-16  |  3KB  |  123 lines

  1. /* soundblaster/audio.c 
  2.     vi:ts=3 sw=3:
  3.  */
  4. /* IMPORTANT NOTE: I can't check that this file works.
  5.  */
  6.  
  7. /* $Id: audio.c,v 4.5 1995/03/17 00:31:36 espie Exp espie $
  8.  * $Log: audio.c,v $
  9.  * Revision 4.5  1995/03/17  00:31:36  espie
  10.  * Soundblaster port uptodate thanks to Rolf.
  11.  *
  12.  * Revision 4.4  1995/02/23  13:52:30  espie
  13.  * primary, secondary -> primary+secondary, primary-secondary
  14.  * strike out 2 multiplications out of 4 !
  15.  *
  16.  * Revision 4.3  1995/02/21  17:57:55  espie
  17.  * Internal problem: RCS not working.
  18.  *
  19.  * Revision 4.2  1995/02/01  16:43:47  espie
  20.  * 23 bit samples.
  21.  *
  22.  * Revision 1.2  1993/12/26  18:54:21  Espie
  23.  * Handle errors better.
  24.  *
  25.  * Revision 3.3  1992/12/03  15:00:50  espie
  26.  * restore stty.
  27.  *
  28.  * Revision 3.1  1992/11/19  20:44:47  espie
  29.  * Protracker commands.
  30.  *
  31.  * Revision 3.0  1992/11/18  16:08:05  espie
  32.  * New release.
  33.  *
  34.  * Revision 1.5  1992/11/17  15:38:00  espie
  35.  * Dummy discard_buffer()
  36.  * Added stereo option (kind of).
  37.  */
  38.  
  39. #include "defs.h"
  40. #include "extern.h"
  41. #include <i386/isa/sblast.h>
  42.  
  43. ID("$Id: audio.c,v 4.5 1995/03/17 00:31:36 espie Exp espie $")
  44.  
  45. #define DEFAULT_BUFFERS
  46. #define DEFAULT_SET_MIX
  47. #define NEW_OUTPUT_SAMPLES_AWARE
  48. #define UNSIGNED_BUFFERS
  49.  
  50. #include "Arch/common.c"
  51.  
  52. FILE *audio;            /* /dev/sb_dsp */
  53.  
  54. int open_audio(f, s)
  55. int f;
  56. int s;
  57.     {
  58.     sbFLAG sb_stereo = s;
  59.     
  60.     audio = fopen("/dev/sb_dsp", "w");
  61.     if (!audio)
  62.         end_all("Error opening audio device");
  63.  
  64.     stereo = s;
  65.     if (ioctl(fileno(audio), DSP_IOCTL_STEREO, &sb_stereo) == -1)
  66.         end_all("Error setting stereo/mono");
  67.  
  68.     if (stereo)
  69.         f *= 2;     /* XXX Stereo takes twice the speed */
  70.  
  71.     if (f == 0)
  72.         f = -1;     /* read current frequency from driver */
  73.  
  74.     if (ioctl(fileno(audio), DSP_IOCTL_SPEED, &f) == -1)
  75.         end_all("Error setting frequency");
  76.  
  77.     buffer = malloc(sizeof(char) * f);    /* Stereo makes x2 */
  78.  
  79.     if (stereo)         /* tacky, I know.. */
  80.         return f/ 2;
  81.     else
  82.         return f;
  83.     }
  84.  
  85. void output_samples(left, right, n)
  86. int left, right, n;
  87.     {
  88.    add_samples8(left, right, n);
  89.     }
  90.  
  91. void discard_buffer()
  92.     {
  93.     /* not implemented */
  94.     }
  95.  
  96. void flush_buffer()
  97.     {
  98.     if (fwrite(buffer, sizeof(*buffer), idx, audio) != idx)
  99.         notice("fwrite didn't write all the bytes ?");
  100.     idx = 0;
  101.     }
  102.  
  103. /*
  104.  * Closing the BSD SBlast sound device waits for all pending samples to play.
  105.  * I think SysV aborts, so you might have to flush manually with ioctl()
  106.  */
  107. void close_audio()
  108.     {
  109.     fclose(audio);
  110.     free(buffer);
  111.     }
  112.  
  113. int update_frequency()
  114.     {
  115.     /* not implemented */
  116.     return 0;
  117.     }
  118.  
  119. void set_synchro(int s)
  120.     {
  121.     /* not implemented */
  122.     }
  123.